home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / POV-Ray 3.0.2 / src / SOURCE / LIBPNG / PNGTEST.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-06  |  5.5 KB  |  234 lines  |  [TEXT/CWIE]

  1.  
  2. /* pngtest.c - a simple test program to test libpng
  3.  
  4.    libpng 1.0 beta 4 - version 0.90
  5.    For conditions of distribution and use, see copyright notice in png.h
  6.    Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
  7.    January 10, 1997
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include "png.h"
  13.  
  14. #ifdef __TURBOC__
  15. #include <mem.h>
  16. #endif
  17.  
  18. /* defined so I can write to a file on gui/windowing platforms */
  19. /*  #define STDERR stderr  */
  20. #define STDERR stdout   /* for DOS */
  21.  
  22. /* input and output filenames */
  23. #ifdef RISCOS
  24. char *inname = "pngtest_png";
  25. char *outname = "pngout_png";
  26. #else
  27. char *inname = "pngtest.png";
  28. char *outname = "pngout.png";
  29. #endif
  30.  
  31. char inbuf[256], outbuf[256];
  32.  
  33. int main(int argc, char *argv[])
  34. {
  35.    FILE *fpin, *fpout;
  36.    png_structp read_ptr;
  37.    png_structp write_ptr;
  38.    png_infop info_ptr;
  39.    png_infop end_info;
  40.    png_bytep row_buf;
  41.    png_byte *near_row_buf;
  42.    png_uint_32 rowbytes;
  43.    png_uint_32 y;
  44.    int channels, num_pass, pass;
  45. #ifdef USE_FAR_KEYWORD
  46.    jmp_buf jmpbuf;
  47. #endif   
  48.    row_buf = (png_bytep)NULL;
  49.    near_row_buf = (png_byte *)NULL;
  50.  
  51.    fprintf(STDERR, "Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
  52.  
  53.    if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING))
  54.    {
  55.       fprintf(STDERR,
  56.          "Warning: versions are different between png.h and png.c\n");
  57.       fprintf(STDERR, "  png.h version: %s\n", PNG_LIBPNG_VER_STRING);
  58.       fprintf(STDERR, "  png.c version: %s\n\n", png_libpng_ver);
  59.    }
  60.  
  61.    if (argc > 1)
  62.      inname = argv[1];
  63.  
  64.    if (argc > 2)
  65.      outname = argv[2];
  66.  
  67.    if (argc > 3)
  68.    {
  69.      fprintf(stderr, "usage: %s [infile.png] [outfile.png]\n", argv[0]);
  70.      exit(1);
  71.    }
  72.  
  73.    fpin = fopen(inname, "rb");
  74.    if (!fpin)
  75.    {
  76.       fprintf(STDERR, "Could not find input file %s\n", inname);
  77.       return 1;
  78.    }
  79.  
  80.    fpout = fopen(outname, "wb");
  81.    if (!fpout)
  82.    {
  83.       fprintf(STDERR, "Could not open output file %s\n", outname);
  84.       fclose(fpin);
  85.       return 1;
  86.    }
  87.  
  88.    read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL,
  89.       (png_error_ptr)NULL,  (png_error_ptr)NULL);
  90.    write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL,
  91.       (png_error_ptr)NULL, (png_error_ptr)NULL);
  92.    info_ptr = png_create_info_struct(read_ptr);
  93.    end_info = png_create_info_struct(read_ptr);
  94.  
  95. #ifdef USE_FAR_KEYWORD
  96.    if (setjmp(jmpbuf))
  97. #else
  98.    if (setjmp(read_ptr->jmpbuf))
  99. #endif
  100.    {
  101.       fprintf(STDERR, "libpng read error\n");
  102.       png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
  103.       png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
  104.       fclose(fpin);
  105.       fclose(fpout);
  106.       return 1;
  107.    }
  108. #ifdef USE_FAR_KEYWORD
  109.    png_memcpy(read_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf));
  110.    if (setjmp(jmpbuf))
  111. #else
  112.    if (setjmp(write_ptr->jmpbuf))
  113. #endif
  114.    {
  115.       fprintf(STDERR, "libpng write error\n");
  116.       png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
  117.       png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
  118.       fclose(fpin);
  119.       fclose(fpout);
  120.       return 1;
  121.    }
  122. #ifdef USE_FAR_KEYWORD
  123.    png_memcpy(write_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf));
  124. #endif
  125.    png_init_io(read_ptr, fpin);
  126.    png_init_io(write_ptr, fpout);
  127.  
  128.    png_read_info(read_ptr, info_ptr);
  129.    png_write_info(write_ptr, info_ptr);
  130.  
  131.    if ((info_ptr->color_type & PNG_COLOR_TYPE_PALETTE)==PNG_COLOR_TYPE_PALETTE)
  132.       channels = 1;
  133.    else
  134.       channels = 3;
  135.    if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
  136.       channels++;
  137.  
  138.    rowbytes = ((info_ptr->width * info_ptr->bit_depth * channels + 7) >> 3);
  139.    near_row_buf = (png_byte *)malloc((size_t)rowbytes);
  140.    row_buf = (png_bytep)near_row_buf;
  141.    if (!row_buf)
  142.    {
  143.       fprintf(STDERR, "No memory to allocate row buffer\n");
  144.       png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
  145.       png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
  146.       fclose(fpin);
  147.       fclose(fpout);
  148.       return 1;
  149.    }
  150.  
  151.    if (info_ptr->interlace_type)
  152.    {
  153.       num_pass = png_set_interlace_handling(read_ptr);
  154.       num_pass = png_set_interlace_handling(write_ptr);
  155.    }
  156.    else
  157.    {
  158.       num_pass = 1;
  159.    }
  160.  
  161.    for (pass = 0; pass < num_pass; pass++)
  162.    {
  163.       for (y = 0; y < info_ptr->height; y++)
  164.       {
  165. #ifdef TESTING
  166.          fprintf(STDERR, "Processing line #%ld\n", y);
  167. #endif
  168.          png_read_rows(read_ptr, (png_bytepp)&row_buf, (png_bytepp)0, 1);
  169.          png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);
  170.       }
  171.    }
  172.  
  173.    png_read_end(read_ptr, end_info);
  174.    png_write_end(write_ptr, end_info);
  175.  
  176.    png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
  177.    png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
  178.  
  179.    fclose(fpin);
  180.    fclose(fpout);
  181.  
  182.    free((png_byte *)near_row_buf);
  183.  
  184.    fpin = fopen(inname, "rb");
  185.  
  186.    if (!fpin)
  187.    {
  188.       fprintf(STDERR, "Could not find file %s\n", inname);
  189.       return 1;
  190.    }
  191.  
  192.    fpout = fopen(outname, "rb");
  193.    if (!fpout)
  194.    {
  195.       fprintf(STDERR, "Could not find file %s\n", outname);
  196.       fclose(fpin);
  197.       return 1;
  198.    }
  199.    while (1)
  200.    {
  201.       int num_in, num_out;
  202.  
  203.       num_in = fread(inbuf, 1, 1, fpin);
  204.       num_out = fread(outbuf, 1, 1, fpout);
  205.  
  206.       if (num_in != num_out)
  207.       {
  208.          fprintf(STDERR, "Files %s and %s are of a different size\n",
  209.                  inname, outname);
  210.          fclose(fpin);
  211.          fclose(fpout);
  212.          return 1;
  213.       }
  214.  
  215.       if (!num_in)
  216.          break;
  217.  
  218.       if (memcmp(inbuf, outbuf, num_in))
  219.       {
  220.          fprintf(STDERR, "Files %s and %s are different\n", inname, outname);
  221.          fclose(fpin);
  222.          fclose(fpout);
  223.          return 1;
  224.       }
  225.    }
  226.  
  227.    fclose(fpin);
  228.    fclose(fpout);
  229.    fprintf(STDERR, "libpng passes test\n");
  230.  
  231.    return 0;
  232. }
  233.  
  234.